9-3 x}ずЛB

矩陣的加減與一般純量(Scalar)的加減類似,唯一的要求是:相加或相減的矩陣必需具有相同的維度。若維度不一致,則 MATLAB 會產生錯誤訊息,例如:

Example 1: 09-矩陣的處理與運算/matrix12.mA = [12 34 56 20]; B = [1 3 2 4]; C = A + B C = 13 37 58 24

若要進行矩陣與純量的加減乘除,一般的作法是直接將純量展開並應用到矩陣的每一個元素,範例如下:

Example 2: 09-矩陣的處理與運算/matrixAndScalarOperation.mA=[1 3 5]; fprintf('A = '); disp(A); fprintf('A+5 = '); disp(A+5); fprintf('A-3 = '); disp(A-3); fprintf('2*A = '); disp(2*A); fprintf('A/3 = '); disp(A/3); A = 1 3 5 A+5 = 6 8 10 A-3 = -2 0 2 2*A = 2 6 10 A/3 = 0.3333 1.0000 1.6667

Hint
上述範例的例外情況會發生在純量除以矩陣,例如 5/A,這一類除法將在後續章節討論。

若欲進行矩陣相乘,必需確認第一個矩陣的直行數目( Column Dimension) 必需等於第二個矩陣的橫列數目(Row Dimension),否則無法進行矩陣相乘,MATLAB 會產生錯誤訊息。以下是一個矩陣相乘的簡單範例:

Example 3: 09-矩陣的處理與運算/matrix13.mA = [1; 2]; B = [3, 4, 5]; C = A*B C = 3 4 5 6 8 10

矩陣的除法,常藉由反矩陣或解線性方程式來達成,可參見本書姊妹作「MATLAB程式設計:進階篇」的第六章「線性代數」第一節及第四節。

矩陣的次方運算,可由「^」來達成,但矩陣必需是方陣,其次方運算才有意義,例如:

Example 4: 09-矩陣的處理與運算/matrix14.mA = magic(3); B = A^2 B = 91 67 67 67 91 67 67 67 91

若在「*」,「/」及「^」之前加上一個句點,MATLAB 將會執行矩陣內「元素對元素」(Element-by-element) 的運算,例如:

Example 5: 09-矩陣的處理與運算/elByEl01.mA = [12; 45]; B = [2; 3]; C = A.*B % 注意「*」前面的句點 D = A./B % 注意「/」前面的句點 E = A.^2 % 注意「^」前面的句點 C = 24 135 D = 6 15 E = 144 2025

對於一個複數矩陣 z,其「共軛轉置」矩陣(Conjugate Transpose) 可表示成矩陣 z',例如:

Example 6: 09-矩陣的處理與運算/conjTranspose01.mi = sqrt(-1); % 單位虛數 z = [1+i, 2; 3, 1+2i]; w = z' % 共軛轉置(注意 z 後面的單引號) w = 1.0000 - 1.0000i 3.0000 + 0.0000i 2.0000 + 0.0000i 1.0000 - 2.0000i

若只想得到任何矩陣 z 的轉置(Transpose),則可表示成矩陣 z.',例如:

Example 7: 09-矩陣的處理與運算/transpose01.mi = sqrt(-1); % 單位虛數 z = [1+i, 2; 3, 1+2i]; w = z.' % 單純轉置(注意 z 後面的句點及單引號) w = 1.0000 + 1.0000i 3.0000 + 0.0000i 2.0000 + 0.0000i 1.0000 + 2.0000i

若 z 為實數,則 z' 和 z.' 的結果是一樣的。(一般常犯的錯誤,會忘了矩陣 z 可能是複數,因此將 z’ 誤認為是單純的矩陣轉置。)

一個向量 a 的 Lp-norm 可以定義為 $$ \|a\|_p = \left(\sum_i |a_i|^p \right)^{1/p} $$

當 p=2 時,此即為向量 a 的長度,或稱歐氏長度(Euclidean Length)。欲求一向量的 Lp-norm,可使用 norm 指令,其使用語法如下:

norm(x, p)

範例如下

Example 8: 09-矩陣的處理與運算/normVector01.ma = [3 4]; x = norm(a, 1) y = norm(a, 2) z = norm(a, inf) x = 7 y = 5 z = 4

Hint
你是否可以證明下列恆等式?
  • norm(a, 1)=$\sum_i |a_i|$
  • norm(a, inf)=$max_i |a_i|$

一個矩陣 A 的 p-norm 可以定義如下: $$ \|A\|_p = max_x \frac{\|Ax\|_p}{\|x\|_p} $$

MATLAB 的 norm 指令亦可用於計算矩陣的 p-norm,例如:

Example 9: 09-矩陣的處理與運算/normMatrix01.mA = [1 2 3; 4 5 6; 7 8 9]; norm(A, 2) ans = 16.8481

MATLAB 還有相當完整的數學函數及三角函數,都可以應用於向量及矩陣。以下將數學函數列表整理如下:

函數說明
abs(x) 純量的絕對值或向量的長度
angle(z) 複數 z 的相角(Phase Angle)
sqrt(x) 開平方
real(z) 複數 z 的實部
imag(z) 複數 z 的虛部
conj(z) 複數 z 的共軛複數
round(x) 四捨五入至最近整數
fix(x) 無論正負,捨去小數至最近整數
floor(x) 地板函數,即捨去正小數至最近整數
ceil(x) 天花板函數,即加入正小數至最近整數
rat(x) 將實數 x 化為分數表示
rats(x) 將實數 x 化為多項分數展開
sign(x) 符號函數(Signum function):$sign(x)=\left\{\begin{matrix}-1, x<0\\0, x=0\\1, x>0\end{matrix}\right.$
rem(x,y) 求 x 除以y的餘數
gcd(x,y) 整數 x 和 y 的最大公因數
lcm(x,y) 整數 x 和 y 的最小公倍數
exp(x) 自然指數
pow2(x) 2 的指數
log(x) 以 e 為底的對數,即自然對數
log2(x) 以 2 為底的對數
log10(x) 以 10 為底的對數

常用的三角函數也列表整理如下:

函數說明
sin(x) 正弦函數
cos(x) 餘弦函數
tan(x) 正切函數
asin(x) 反正弦函數
acos(x) 反餘弦函數
atan(x) 反正切函數
atan2(x,y) 四象限的反正切函數
sinh(x) 超越正弦函數
cosh(x) 超越餘弦函數
tanh(x) 超越正切函數
asinh(x) 反超越正弦函數
acosh(x) 反超越餘弦函數
atanh(x) 反超越正切函數

此外,MATLAB 還有一些函數是針對向量元素的統計量而設計,例如 min(求向量的極小值)、mean(求向量的平均值)等,列表整理如下:

函數說明
min(x) 向量 x 的元素的最小值
max(x) 向量 x 的元素的最大值
mean(x) 向量 x 的元素的平均值
median(x) 向量 x 的元素的中位數
std(x) 向量 x 的元素的標準差
diff(x) 向量 x 的相鄰元素的差
sort(x) 對向量 x 的元素進行排序(Sorting)
length(x) 向量 x 的元素個數
norm(x) 向量 x 的歐氏(Euclidean)長度
sum(x) 向量 x 的元素總和
prod(x) 向量 x 的元素總乘積
cumsum(x) 向量 x 的累計元素總和
cumprod(x) 向量 x 的累計元素總乘積
dot(x, y) 向量 x 和 y 的內積
cross(x, y) 向量 x 和 y 的外積

例如,sort 指令可對向量元素進行排序(Sorting):

Example 10: 09-矩陣的處理與運算/sort01.mx = [3 5 8 1 4]; [sorted, index] = sort(x) % 對矩陣 x 的元素進行排序 sorted = 1 3 4 5 8 index = 4 1 5 2 3

其中 sorted 是排序後的向量,index 則是每個排序後的元素在原向量 x 的位置,換句話說,x(index) 即等於 sorted 向量。另一個有趣的問題:如何使用 sort 指令加上前例中的 sorted 及 index 來求得原先的向量 x?(此題就留給各位讀者去練功吧!)

上述列表的函數大部份也適用於矩陣,他們只是將矩陣視為行向量的集合,來逐一對行向量進行運算。例如:欲找出一矩陣最大元素的位置,可輸入如下:

Example 11: 09-矩陣的處理與運算/max01.mx = magic(5); [colMax, colMaxIndex] = max(x) colMax = 23 24 25 21 22 colMaxIndex = 2 1 5 4 3

其中 colMax 代表每一直行的最大值,colMaxIndex 則是每一直行出現最大值的位置。若要求得 x 的最大元素的位置,可輸入如下:

Example 12: 09-矩陣的處理與運算/max02.mx = magic(5); [colMax, colMaxIndex] = max(x); [maxValue, maxIndex] = max(colMax); fprintf('Max value = x(%d, %d) = %d\n', ... colMaxIndex(maxIndex), maxIndex, maxValue);Max value = x(5, 3) = 25

由此可以看出,矩陣 x 的最大元素即是 maxValue,而其發生位置為 [colMaxIndex(maxIndex), maxIndex] = [5 , 3]。

Hint
若只要找出一矩陣 x 的最大值,可輸入 max(max)或是 max(x(:))。


MATLAB程式設計:入門篇